import { IDictionary } from "../Interfaces/IUtils";

/**字典类 */
export class Dictionary<K, V> implements IDictionary<K, V> {
  /**
   * 索引器
   * TIPS:通过key值获取对象或者设置值。
   * TODO:暂未实现
   */
  [key: number]: V;

  constructor() {
    this.values = [];
    this.keys = [];
  }
  /**
   * 字典总数
   */
  get count(): number {
    return this.keys.length;
  }
  /**
   * 获取所有的子元素列表。
   */
  values: Array<V>;
  /**
   * 获取所有的子元素键名列表。
   */
  keys: Array<K>;
  /**
   * 给指定的键名设置值。
   * @param	key 键名。
   * @param	value 值。
   */
  set(key: K, value: V): void {
    var index = this.keys.indexOf(key);
    if (index > -1) {
      this.values[index] = value;
    } else {
      this.keys.push(key);
      this.values.push(value);
    }
  }

  /**
   * 获取指定对象的键名索引。
   * @param	key 键名对象。
   * @return 键名索引。
   */
  indexOf(key: K): number {
    return this.keys.indexOf(key);
  }
  /**
   * 返回指定键名的值。
   * @param	key 键名对象。
   * @return 指定键名的值。
   */
  get(key: K): V {
    var index = this.keys.indexOf(key);
    if (index > -1) return this.values[index];
    return null;
  }
  /**
   *  获取Key值 通过索引
   */
  getKey(index: number): K {
    return this.keys[index];
  }
  /**
   *  获取value值 通过索引
   */
  getValue(index: number): V {
    return this.values[index];
  }
  /**
   * 截取部分数据
   * @param start 起始值
   * @param end 结束值
   */
  takeList(start: number, end: number): IDictionary<K, V> {
    var takeList = new Dictionary<K, V>();
    for (let i = start; i < end; i++) {
      takeList.set(this.keys[i], this.values[i]);
    }
    return takeList;
  }
  /**
   * 移除指定键名的值。
   * @param	key 键名对象。
   * @return 是否成功移除。
   */
  remove(key: K): boolean {
    var index = this.indexOf(key);
    if (index < 0) {
      return false;
    } else {
      this.values.splice(index, 1);
      this.keys.splice(index, 1);
      return true;
    }
  }
  /**
   * 清除此对象的键名列表和键值列表。
   */
  clear(): void {
    this.values = [];
    this.keys = [];
  }
  /**
   * 是否存在数据
   */
  containsKey(key: K): boolean {
    return this.indexOf(key) >= 0;
  }
}
